package com.phs.main.security.jwt;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.apache.shiro.crypto.hash.SimpleHash;

import java.util.Date;

public class JWTUtil {
	//	过期时间 6小时
	private static final long EXPIRE_TIME = 6 * 60 * 60 * 1000;

	/**
	 * 密码加密
	 *
	 * @param source 被加密字符
	 * @param salt   盐
	 * @return 加密数据
	 */
	public static String md5Encryption(String source, String salt) {
		String algorithmName = "MD5";//加密算法
		int hashIterations = 1024;//加密次数
		SimpleHash simpleHash = new SimpleHash(algorithmName, source, salt, hashIterations);
		return simpleHash + "";
	}

	/**
	 * 验证token 正确性
	 *
	 * @param token    密钥
	 * @param username 登录名
	 * @param password 密码
	 * @return 正确？
	 */
	public static boolean verify(String token, String username, String password) {
		try {
			Algorithm algorithm = Algorithm.HMAC256(password);
			JWTVerifier verifier = JWT.require(algorithm)
					.withClaim("username", username)
					.build();
			verifier.verify(token);
			return true;
		} catch (Exception ignored) {
			return false;
		}
	}

	/**
	 * 获取token中的信息
	 *
	 * @param token 密钥
	 * @return token中包含的用户名
	 */
	public static String getUsername(String token) {
		try {
			DecodedJWT jwt = JWT.decode(token);

			return jwt.getClaim("username").asString();
		} catch (JWTDecodeException e) {
			return null;
		}
	}

	/**
	 * 生成签名，2min后过期
	 *
	 * @param username 用户名
	 * @param password 密码
	 * @return 加密token
	 */
	public static String sign(String username, String password) {
		try {
			// 指定过期时间
			Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);

			Algorithm algorithm = Algorithm.HMAC256(password);
			// 附带username信息
			return JWT.create()
					.withClaim("username", username)
					.withExpiresAt(date)
					.sign(algorithm);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 判断过期
	 *
	 * @param token token
	 * @return 过期？
	 */
	public static boolean isExpire(String token) {
		DecodedJWT jwt = JWT.decode(token);
		return System.currentTimeMillis() > jwt.getExpiresAt().getTime();
	}
}
